home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / backends / filechan.c < prev    next >
C/C++ Source or Header  |  1993-03-18  |  3KB  |  145 lines

  1. /*  $Revision: 1.12 $
  2. **
  3. **  An InterNetNews channel process that splits a funnel entry into
  4. **  separate files.  Originally from Robert Elz <kre@munnari.oz.au>.
  5. */
  6. #include "configdata.h"
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <errno.h>
  11. #include <fcntl.h>
  12. #include <sys/file.h>
  13. #include "paths.h"
  14. #include "clibrary.h"
  15. #include "libinn.h"
  16. #include "macros.h"
  17.  
  18. extern void    MAPread();
  19. extern char    *MAPname();
  20.  
  21. int
  22. main(ac, av)
  23.     int            ac;
  24.     char        *av[];
  25. {
  26.     char        buff[2048];
  27.     register char    *p;
  28.     register char    *next;
  29.     register int    i;
  30.     register int    fd;
  31.     int            Fields;
  32.     STRING        Directory;
  33.     BOOL        Map;
  34.     FILE        *F;
  35.     struct stat        Sb;
  36.     UID_T        uid;
  37.     GID_T        gid;
  38.     UID_T        myuid;
  39.  
  40.     /* Set defaults. */
  41.     Fields = 1;
  42.     Directory = _PATH_BATCHDIR;
  43.     Map = FALSE;
  44.     myuid = geteuid();
  45.     (void)umask(NEWSUMASK);
  46.  
  47.     /* Parse JCL. */
  48.     while ((i = getopt(ac, av, "d:f:m:p:")) != EOF)
  49.     switch (i) {
  50.     default:
  51.         (void)fprintf(stderr, "Usage error.\n");
  52.         exit(1);
  53.     case 'd':
  54.         Directory = optarg;
  55.         break;
  56.     case 'f':
  57.         Fields = atoi(optarg);
  58.         break;
  59.     case 'm':
  60.         Map = TRUE;
  61.         MAPread(optarg);
  62.         break;
  63.     case 'p':
  64.         if ((F = fopen(optarg, "w")) == NULL) {
  65.         (void)fprintf(stderr, "filechan cant fopen %s %s\n",
  66.             optarg, strerror(errno));
  67.         exit(1);
  68.         }
  69.         (void)fprintf(F, "%ld\n", (long)getpid());
  70.         if (ferror(F) || fclose(F) == EOF) {
  71.         (void)fprintf(stderr, "filechan cant fclose %s %s\n",
  72.             optarg, strerror(errno));
  73.         exit(1);
  74.         }
  75.         break;
  76.     }
  77.  
  78.     /* Move, and get owner of current directory. */
  79.     if (chdir(Directory) < 0) {
  80.     (void)fprintf(stderr, "Can't chdir to %s, %s\n",
  81.         Directory, strerror(errno));
  82.     exit(1);
  83.     }
  84.     if (stat(".", &Sb) < 0) {
  85.     (void)fprintf(stderr, "Can't stat %s, %s\n",
  86.         Directory, strerror(errno));
  87.     exit(1);
  88.     }
  89.     uid = Sb.st_uid;
  90.     gid = Sb.st_gid;
  91.  
  92.     /* Read input. */
  93.     while (fgets(buff, sizeof buff, stdin) != NULL) {
  94.     if ((p = strchr(buff, '\n')) != NULL)
  95.         *p = '\0';
  96.  
  97.     /* Skip the right number of leading fields. */
  98.     for (i = Fields, p = buff; *p; p++)
  99.         if (*p == ' ' && --i <= 0)
  100.         break;
  101.     if (*p == '\0')
  102.         /* Nothing to write.  Probably shouldn't happen. */
  103.         continue;
  104.  
  105.     /* Add a newline, get the length of all leading fields. */
  106.     *p++ = '\n';
  107.     i = p - buff;
  108.  
  109.     /* Rest of the line is space-separated list of filenames. */
  110.     for (; *p; p = next) {
  111.         /* Skip whitespace, get next word. */
  112.         while (*p == ' ')
  113.         p++;
  114.         for (next = p; *next && *next != ' '; next++)
  115.         continue;
  116.         if (*next)
  117.         *next++ = '\0';
  118.  
  119.         if (Map)
  120.         p = MAPname(p);
  121.         fd = open(p, O_CREAT | O_WRONLY | O_APPEND, BATCHFILE_MODE);
  122.         if (fd >= 0) {
  123.         /* Try to lock it and set the ownership right. */
  124.         (void)LockFile(fd, TRUE);
  125.         if (myuid == 0 && uid != 0)
  126.             (void)chown(p, uid, gid);
  127.  
  128.         /* Just in case, seek to the end. */
  129.         (void)lseek(fd, 0L, SEEK_END);
  130.  
  131.         errno = 0;
  132.         if (write(fd, (POINTER)buff, (SIZE_T)i) != i) {
  133.             perror("write");
  134.             exit(1);
  135.         }
  136.  
  137.         (void)close(fd);
  138.         }
  139.     }
  140.     }
  141.  
  142.     exit(0);
  143.     /* NOTREACHED */
  144. }
  145.